package cn.caplike.demo.repository.java.concurrency.threadpool.demo;

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

/**
 * 简介：线程池测试
 *
 * @author 李珂 2017年11月28日 下午5:06:36
 */
public class Test01 {

	/**
	 * 简介：entry<br>
	 * 详细说明：从执行结果可以看出，当线程池中线程的数目大于5时，便将任务放入任务缓存队列里面，当任务缓存队列满了之后，便创建新的线程。如果下面程序中，
	 * 将for循环中改成执行20个任务，就会抛出任务拒绝异常了。
	 *
	 * @param args
	 * @author 李珂 2017年11月28日 下午5:06:36
	 */
	public static void main(String[] args) {
		ThreadPoolExecutor excutor = new ThreadPoolExecutor(5, 10, 200, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(5));

		for (int i = 0; i < 15; i++) {
			MyTask myTask = new Test01().new MyTask(i);
			excutor.execute(myTask);
			System.out.println("线程池中的线程数目：" + excutor.getPoolSize() + "，队列中等待执行的任务数目：" + excutor.getQueue().size() + "，已执行完的：" + excutor.getCompletedTaskCount());
		}
		excutor.shutdown();
	}

	private class MyTask implements Runnable {
		private int taskNum;

		public MyTask(int taskNum) {
			this.taskNum = taskNum;
		}

		/*
		 * (non-Javadoc)
		 *
		 * @see java.lang.Runnable#run()
		 */
		@Override
		public void run() {
			System.out.println("task" + taskNum + "正在执行...");
			try {
				Thread.sleep(4000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			System.out.println("task" + taskNum + "执行完毕...");
		}
	}

}
